#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>
#include <cstring>
#include <vector>

// 创建多线程
const int num = 10;

void *routine(void *args)
{
    // sleep(1);
    std::string name = static_cast<const char *>(args);
    int cnt = 5;
    while (cnt--)
    {
        std::cout << "new线程名字: " << name << std::endl;
        sleep(1);
    }
    delete (char *)args;

    return nullptr;
}

int main()
{
    std::vector<pthread_t> tids;
    for (int i = 0; i < num; i++)
    {
        pthread_t tid;
        // char id[64];
        char *id = new char[64];
        snprintf(id, sizeof(id), "thread-%d", i);
        int n = pthread_create(&tid, nullptr, routine, (void *)id);
        if (n == 0)
        {
            tids.push_back(tid);
        }
        else
            continue;
        sleep(1);
    }

    for (int i = 0; i < num; i++)
    {
        int n = pthread_join(tids[i], nullptr);
        if (n == 0)
        {
            std::cout << "等待新线程成功" << std::endl;
        }
    }

    return 0;
}

// 1. main函数结束，代表主线程的结束，一般也代表进程的结束
// 2. 新线程对应的入口函数，运行结束，代表当前线程运行结束

// 3. 一个问题， 给线程传递的参数和返回值，可以是任意类型

// class Task
// {
// public:
//     Task(int a, int b)
//         : _a(a),
//           _b(b)
//     {
//     }
//     int Execute()
//     {
//         return _a + _b;
//     }

//     ~Task() {}

// private:
//     int _a;
//     int _b;
// };

// class Result
// {
// public:
//     Result(int result)
//         : _result(result)
//     {
//     }

//     int GetResult() { return _result; }
//     ~Result() {}

// private:
//     int _result;
// };

// // 线程终止问题
// // 1.线程的入口函数，进行return就是线程终止
// // 注意：线程不能用exit()终止，因为exit是终止进程的
// // 2.pthread_exit()
// // 3.pthread_cancel(),线程如果被取消，退出结果是-1【PTHREAD_CANCELED】

// // void *p: 开辟空间
// void *routine(void *args)
// {
//     pthread_detach(pthread_self());
//     std::cout << "新线程被分离" << std::endl;

//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "new线程名字: " << std::endl;
//         sleep(1);
//     }

//     return nullptr;
//     // Task *t = static_cast<Task *>(args);
//     // sleep(100);
//     // Result *res = new Result(t->Execute());
//     // sleep(1);
//     // // return res;
//     // // exit(13);
//     // pthread_exit(res);
//     // std::cout << "新线程不应该运行到这里" << std::endl;
// }

// int main()
// {
//     pthread_t tid;
//     // Task *t = new Task(10, 20);
//     pthread_create(&tid, nullptr, routine, (void *)"thread-1");

//     // pthread_detach(tid);

//     // std::cout << "新线程被分离" << std::endl;
//     int cnt = 5;
//     while (cnt--)
//     {
//         std::cout << "main线程名字: " << std::endl;
//         sleep(1);
//     }

//     int n = pthread_join(tid, nullptr);
//     if (n != 0)
//     {
//         std::cout << "pthread_join error " << strerror(n) << std::endl;
//     }
//     else
//     {
//         std::cout << "pthread_join success " << strerror(n) << std::endl;
//     }

//     // sleep(3);
//     // pthread_cancel(tid);
//     // std::cout << "新线程被取消" << std::endl;

//     // PTHREAD_CANCELED;

//     // void *ret = nullptr;
//     // pthread_join(tid, &ret);
//     // std::cout << "新线程结束，运行结果: " << (long long)ret << std::endl;
//     // Result *ret = nullptr;
//     // pthread_join(tid, (void **)&ret);
//     // int n = ret->GetResult();

//     // std::cout << "新线程结束，运行结果: " << n << std::endl;
//     // delete t;
//     // delete ret;
//     return 0;
// }

// int flag = 100;

// void showtid(pthread_t &tid)
// {
//     printf("tid: 0x%lx\n", tid);
// }

// std::string FormatId(const pthread_t &tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }

// void *routine(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     pthread_t tid = pthread_self();
//     int cnt = 5;
//     while (cnt)
//     {
//         std::cout << "我是一个新线程: 我的名字是: " << name << "我的Id是: " << FormatId(tid) << std::endl;
//         sleep(1);
//         cnt--;
//         flag++;
//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     int n = pthread_create(&tid, nullptr, routine, (void *)"thread-1");
//     (void)n;

//     showtid(tid);

//     int cnt = 5;
//     while (cnt)
//     {
//         std::cout << "我是main线程: 我的名字是: main thread" << " 我的Id是: " << FormatId(pthread_self()) << " flag: " << flag << std::endl;
//         sleep(1);
//         cnt--;
//     }

//     pthread_join(tid, nullptr);

//     return 0;
// }